iT邦幫忙

2024 iThome 鐵人賽

DAY 18
1

目錄

摘要

在上一篇我們學到用composite action的方式複用workflow

這篇我們會來會來看一下如何用在D13提到的actions/toolkit的core撰寫JS action

何時需要JS action

使用actions/toolkit可以以JS撰寫action,這個方式建立的action,可以簡化一些用shell script處理較複雜的事(e.g.:打API、大量的條件判斷)

此外這也是除了reusable workflow、composite action以外的複用action方法、建立發布到Marketplace的action的方法

步驟

前置準備

  1. 下載Node v20以上的版本(已經裝過就跳過)
  2. 在你的專案建立package.json
npm init

# 你想用default設定的話,就加上-y
npm init -y
  1. 安裝package
npm install @actions/core
npm install @actions/github

建立metadata file

在專案跟目錄底下建立action.yml

注意metadata file的檔名一定要是action.yml(yaml),如果取不一樣的名稱會出錯

name: 'Say hello'
description: 'Greet someone'
inputs:
  name:
    description: "Someone's name"
    required: true
    default: 'Somebody'
outputs:
  reply:

runs:
  using: 'node20'
  main: 'index.js'

建立action

新增一個index.js,放在哪都可以,只要在action.yml的main正確地指向它的位置即可

const core = require('@actions/core');
const github = require('@actions/github');

try {
  const nameToGreet = core.getInput('name');
  console.log(`Hello ${nameToGreet}!. How's it going with your new workflow?`);

  // 透過github context可以取得觸發workflow的相關資訊
  const repoName = github.context.payload.repository;
  core.setOutput(`reply', 'It\'s amazing. I installed actions/toolkit to my repo. With the package, I can write a workflow with JavaScript in ${repoName}.`);
  
} catch (error) {
  // 印出error,並拋出錯誤讓整個workflow失敗
  core.setFailed(error.message, 1);
}

接下來有兩種做法

  1. 把包含node_modules/*的所有有變更的檔案都推到遠端

之所以會需要這麼做是因為GitHub 會在runtime下載workflow中的每個操作,並將其作為完整的package執行,所以才把JS action會用到的package推到遠端

  1. 如果不想把node_modules推到遠端使用下個步驟提到的ncc進行打包

最後打上tag

git tag 1.0.0
git push --follow-tags

打包

如果你要把action發佈到marketplace需要打包,但是如果只是要在同repo內使用就可以跳過打包步驟

在同個repo內使用JS action的方法和下個段落提到的相去不遠,只差在uses傳的是metadata file所在的path,詳細會在之後的篇章中示範(預定在Day24)

npm i -g @vercel/ncc
#或
npm i @vercel/ncc

用指令編譯index.js,@vercel/ncc會把index.js內的程式碼和它使用到的package一起打包成一個檔案,如此一來就不必把node_modules推到遠端

這樣就不用在workflow中額外跑安裝package的指令,這樣可以省下每次安裝package的時間,也可以避免當npm registry掛掉的時無法下載package進而導致workflow故障的風險

ncc build index.js --license licenses.txt

#如果非全域安裝則在指令前加上npx
npx ncc build index.js --license licenses.txt

修改action.yml的main為編譯過的檔案

main: 'dist/index.js'

如果沒有把node_modules加入.gitigore的話,最後記得把node_modules刪掉

rm -rf node_modules/*

使用action

name: Try JavaScript action

on:
  push:
    branches:
      - master

jobs:
  try:
    runs-on: ubuntu-latest
    steps:
      # clone repo才讀得到package.json
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: |
          # 選擇不把node_modules推到遠端的話,需要先安裝package
          # 若有推到遠端的話以上3個step都可以省略
          npm install
          npm list

      - id: trial
        # 如果是走打包action的方式一定要遵循<owner name>/<repo name>@<tag>的格式
        uses: tempura327/try-github-actions@v1.0.8
        with:
          name: 'Tempura Ninja'
      
      - run: |
          echo How\'s it going with your new workflow?
          echo ${{ steps.trial.outputs.output1 }}
        shell: bash


上一篇
Day 17 - 複用workflow (下)
下一篇
Day 19 - 在workflow中執行js檔
系列文
菜逼八用Github Actions30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言